package com.eddy.project.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.eddy.project.model.domain.User;
import com.eddy.project.model.dto.user.crud.UserQueryRequest;
import com.eddy.project.model.vo.LoginUserVO;
import com.eddy.project.model.vo.UserVO;
import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @author eddy
* @description 针对表【t_user(用户表)】的数据库操作Service
* @createDate 2023-07-20 11:48:43
*/
public interface UserService extends IService<User> {

    /**
     * 注册
     * @param userAccount   用户账号
     * @param userPassword  用户密码
     * @param checkPassword 确认密码
     * @param planetCode    星球编号
     * @return 新用户id
     */
    long userRegister(String userAccount, String userPassword, String checkPassword, String planetCode);

    /**
     * 用户登录
     * @param userAccount   用户账号
     * @param userPassword  用户密码
     * @param request       请求对象
     * @return 脱敏后的用户信息
     */
    LoginUserVO userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 用户登出
     * @param request   请求对象
     * @return 0失败 or 1 成功
     */
    int userLogout(HttpServletRequest request);

    /**
     * 根据 标签获取用户
     * @param tagNames
     * @return
     */
    List<User> queryUsersByTags(List<String> tagNames);

    /**
     * 根据 标签获取用户 内存计算
     * @param tagNames
     * @return
     */
    List<User> queryUsersByTagsByMemory(List<String> tagNames);

    /**
     * 获取安全用户 返回 User
     * @param originUser
     * @return
     */
    User getSafetyUser(User originUser);

    /**
     * 获取当前登录用户信息
     * @return
     */
    User getLoginUser(HttpServletRequest request);

    /**
     * 是否为管理员
     *
     * @param request
     * @return
     */
    boolean isAdmin(HttpServletRequest request);

    /**
     * 推荐user
     * @param num
     * @param user
     * @return
     */
    List<User> matchUsers(long num, User user);

    /**
     * 获取脱敏的用户信息
     *
     * @param user
     * @return
     */
    UserVO getUserVO(User user);

    /**
     * 获取脱敏的用户信息
     *
     * @param userList
     * @return
     */
    List<UserVO> getUserVO(List<User> userList);

    /**
     * 获取查询条件
     *
     * @param userQueryRequest
     * @return
     */
    QueryWrapper<User> getQueryWrapper(UserQueryRequest userQueryRequest);


    User userLoginByMpOpen(WxOAuth2UserInfo userInfo, HttpServletRequest request);


    LoginUserVO getLoginUserVO(User user);
}
